#ifndef personnage_H
#define personnage_H

#include "terrain.h"
#include "projectiles.h"

typedef struct
{
    int sante;
    int nbVies;
    int score;
    projectile** munition;
    int nbMunitions;
    bloc* hitBox;
    int posCP;
}personnage;

typedef struct sCellule
{
	personnage* Ennemi;
	struct sCellule* Suivant;
	int action;
}celluleEnnemi;

typedef struct
{
	celluleEnnemi* Boss;
	int nbEnnemis;
}listeEnnemis;

void initPerso (personnage* perso); /* Verifie */
/* Preconditions : perso est non NULL */
/* Postconditions : perso est initialise */

void setPersonnage (personnage* perso, int sante, int vies, int score, const float posX, const float posY, projectile* arme, const int nbMunitions, bloc* persoBloc); /* Verifie */
/* Preconditions : perso est non NULL et initialise, sante > 0, vies > 0, score >= 0, nbMunitions, posX et posY > 0, arme et persoBloc sont initialises et remplis */
/* Postconditions : perso possede toutes les caracteristiques donnees par les parametres de la procedure */

void copiePersonnage (personnage* P1, personnage* P2); /* Verifie */
/* Preconditions : P1 et P2 sont initialises et non NULL */
/* Postconditions : P2 possede les memes caracteristiques que P1 */

/*void accroupir (personnage *perso);*/

void personnageToucheEnnemi (personnage *perso, personnage* Ennemi);
/* Preconditions : perso et Ennemi sont initialises et non NULL  */
/* Postconditions : sante de perso diminue de la valeur des degats de l'arme de Ennemi */

void personnageToucheProjectile (personnage *perso, projectile* armeEnnemi);
/* Preconditions : perso et armeEnnemi sont initialises et non NULL  */
/* Postconditions : sante de perso diminue de la valeur des degats de armeEnnemi */

void resurrectionPerso (terrain* T, personnage* Perso);
/* Preconditions :  */
/* Postconditions :  */

void mortPersonnage (terrain* T,personnage *perso); /* Verifie */
/* Preconditions : perso est initialise et non NULL, nbVies de perso > 0 */
/* Postconditions : nbVies de perso diminue de 1 */

void setSanteMonte (personnage *perso, int bonus);
/* Preconditions :  */
/* Postconditions :  */

void setViePlus (personnage *perso); /* Verifie */
/* Preconditions : perso est initialise et non NULL */
/* Postconditions : nbVies de perso augmente de 1  */

void setScore (personnage *perso, int score); /* Verifie */
/* Preconditions : perso est initialise et non NULL */
/* Postconditions : Le score de perso augmente de "score" */

int getScore (personnage* perso); /* Verifie */
/* Preconditions : perso est initialise et non NULL */
/* Postconditions : retourne la variable score de perso */

void initCelluleEnemi (celluleEnnemi* C); /* Verifie */
/* Preconditions : C est non NULL */
/* Postconditions : C est initialisee */

void initListeEnnemis (listeEnnemis* L); /* Verifie */
/* Preconditions : L est non NULL */
/* Postconditions : L est initialisee */

void ajouteEnnemi (listeEnnemis* L, personnage* typeEnnemi, const int x, const int y, const int action); /* Verifie */
/* Preconditions : L est initialisee et non NULL, typeEnnemi est initialisee et non NULL, x et y positifs */
/* Postconditions : L contient une nouvelle celluleEnnemi dont la variable Ennemi possede toutes les donnees de typeEnnemi sauf la position qui est donnee par le couple (x, y) */

void infligeDegatsSurEnnemi (listeEnnemis* L, personnage* P, int position);
/* Preconditions : L et P sont initialises et non NULL, position < nbEnnemis de L */
/* Postconditions : L'ennemi pointe par la celluleEnnemi en position "position" dans la liste voit sa sante diminuer de la valeur des degats de l'arme de perso. Si la sante de cet ennemi est <= 0, il disparait de la liste */

void videPerso (personnage* P);
/* Preconditions : L est initialisee et non NULL, position < nbEnnemis de L */
/* Postconditions : L'ennemi en position "position" voit sa cellule supprimee de la liste */

void supprimeEnnemi (listeEnnemis* L, int position);
/* Preconditions : L est initialisee et non NULL, position < nbEnnemis de L */
/* Postconditions : L'ennemi en position "position" voit sa cellule supprimee de la liste */

void videListeEnnemis (listeEnnemis* L);
/* Preconditions :  */
/* Postconditions :  */

void personnageTestRegression();

#endif
